from os import walk, getcwd
from os.path import join, dirname
from datetime import datetime
from mydb.odbc import base


import xlsxwriter, xlrd

def report(date):
	"This function generates report file for the date"
	#beginning of function suite
	
	cur_dir = getcwd()
	date_list=date.split('.')
	rep_date=date_list[1]+date_list[0]
	rep_dir = join(dirname(cur_dir), "reports")
	rep_file = join(rep_dir, rep_date+".xlsx")
	
	rows = dbfread(date_list)
	book(date, rep_file, rows)
	#end of function suite
	return

def book(date, rep_file, rows):
	"This function generates xlsx book of the report for the date"
	#beginning of function suite
	#Создается xlsx книга 
	book = xlsxwriter.Workbook(rep_file)
	#В книге создается лист
	sheet = book.add_worksheet('sheet')
	
	#Устанавливается ориентация страницы
	sheet.set_landscape()
	#Устанавливается размер бумаги
	sheet.set_paper(9)
	#Устанавливается выравнивание по горизонтали
	sheet.center_horizontally()
	#Устанавливаются границы печати
	sheet.set_margins(left=0.2, right=0.2, top=0.2, bottom=0.2)
	
	#Создается словарь данных
	data = {}
	#Создается словарь форматов
	format = {}

	#Наполняется словарь данных для заголовка
	data['top'] = 'Реестр отгрузки продукции по номенклатуре за месяц '+date+' г.'
	#Наполняется словарь данных для шапки таблицы
	data['heads']=[[],[]]
	#Строка №1
	data['heads'][0]=['№ п/п', '№ ТТН', '№ СФ', 'Дата', 'Наименование изделия', 'Кол-во, шт.', 'Вес, кг', 'Контрагент', 'Адрес получателя', 'Ф.И.О. вод., рег. ном. ТС', 'Сумма без НДС, руб.']
	#Строка №2
	lh=len(data['heads'][0])
	data['heads'][1]=list(range(1,lh+1))
	
	date_ind=3
	
	#Наполняется словарь данных таблицы
	data['rows'] = rows
	#Наполняется словарь форматов для заголовка
	format['top'] = book.add_format({'bold': True, 'font_name': 'Times New Roman', 'font_size': 12, 'underline': 1, 'align': 'center'})
	#Наполняется словарь форматов для шапки таблицы
	format['heads'] = [[],[]]
	#Строка №1
	format['heads'][0] = book.add_format({'font_name': 'Times New Roman', 'font_size': 12, 'bold': True, 'align': 'left', 'text_wrap': 1, 'border':1})
	#Строка №2
	format['heads'][1] = book.add_format({'font_name': 'Times New Roman', 'font_size': 12, 'align': 'center', 'border':1})
	
	#Наполняется словарь форматов для строки данных таблицы
	format['rows'] = book.add_format({'font_name': 'Times New Roman', 'font_size': 12, 'align': 'left', 'border':1, 'text_wrap': 1})
	
	format['date_value'] = book.add_format({'font_name': 'Times New Roman', 'font_size': 12, 'align': 'left', 'border':1, 'text_wrap': 1, 'num_format': 'dd/mm/yyyy'})
	
	format['lastrow'] = book.add_format({'font_name': 'Times New Roman', 'font_size': 12, 'align': 'right', 'border':1, 'text_wrap': 1, 'num_format': '# ### ##0.00'})

	#На лист записывается заголовок таблицы
	sheet.merge_range(0,0,0,lh-1, data['top'], format['top'])
	#Через строку ниже записываются строки шапки таблицы
	for x in range(2):
		for y in range(lh):
			sheet.write(2+x, y, data['heads'][x][y], format['heads'][x])
	
	#Под шапкой записываются строки
	counter=1
	for z in range(len(data['rows'])):
		sheet.write(2+x+1+z, 0, counter, format['rows'])
		counter+=1
		for y in range(1,lh):
			if y==10:
				sheet.write(2+x+1+z, y, data['rows'][z][y], format['lastrow'])
			elif y==date_ind:
				sheet.write(2+x+1+z, y, data['rows'][z][y], format['date_value'])
			else:
				sheet.write(2+x+1+z, y, data['rows'][z][y], format['rows'])
		
	#Записывается Итого
	#Слово "ИТОГО:"

	sheet.write(2+x+len(data['rows'])+2, y-1, 'ИТОГО:', format['rows'])
	#Подсчитывается сумма
	sum=0
	for row in data['rows']:
		if row[lh-1]:
			sum+=row[lh-1]
	#Записывается сумма
	sheet.write(2+x+len(data['rows'])+2, y, sum, format['lastrow'])
	
	
	#Устанавливается повторение на каждой странице шапки таблицы (строк 3 и 4)
	sheet.repeat_rows(2,3)
	#Устанавливается ширина колонок таблицы
	#Колонка 1(A)
	sheet.set_column(0,0, 4.5)
	#Колонка 2(B)
	sheet.set_column(1,1, 7)
	#Колонка 3(C)
	sheet.set_column(2,2, 7)
	#Колонка 4(D)
	sheet.set_column(3,3, 12)
	#Колонка 5(E)
	sheet.set_column(4,4, 26)
	#Колонка 6(F)
	sheet.set_column(5,5, 5)
	#Колонка 7(G)
	sheet.set_column(6,6, 5)
	#Колонка 8(H)
	sheet.set_column(7,7, 14.5)
	#Колонка 9(I)
	sheet.set_column(8,8, 17)
	#Колонка 10(J)
	sheet.set_column(9,9, 10)
	#Колонка 11(K)
	sheet.set_column(10,10, 15)
	#end of function suite
	
	#Книга сохраняется и закрывается
	book.close()
	
	return

def dbfread(date_list):
	"This function reads data from 1C77 DBF files"
	#beginning of function suite
	sql='''SELECT 

'None', a.docno, b.docno, b.date, c.descr, d.sp284, 'None', 

PADR(SUBSTR((g.block + NVL(h.block,"") + NVL(i.block,"")),10,VAL("0x"+(ALLTRIM(SUBSTR(g.block,1,9))))),230), 

e.sp123, 'None', d.sp286

FROM 1sjourn.DBF a, 1sjourn b, sc156 c, dt294 d, sc133 e, dh11012 f, 

1SBLOB g 
LEFT JOIN 1SBLOB.DBF h ON g.objid=h.objid and g.fieldid=h.fieldid and h.blockno=1 
LEFT JOIN 1SBLOB.DBF i ON g.objid=i.objid and g.fieldid=i.fieldid and i.blockno=2

WHERE alltrim(g.fieldid)="3E" and g.blockno=0 and e.id=g.objid and 

ALLTRIM(a.iddoc)=ALLTRIM(SUBSTR(f.sp11069,7)) AND ALLTRIM(a.idjournal)='DW' AND ALLTRIM(b.iddoc)=ALLTRIM(f.iddoc) AND ALLTRIM(b.idjournal)='9O3' AND ALLTRIM(d.sp283)=ALLTRIM(c.id) AND ALLTRIM(d.iddoc)=ALLTRIM(SUBSTR(f.sp11069,7)) AND ALLTRIM(e.id)=ALLTRIM(f.sp10982)  AND SUBSTR(b.docno,1,1)='0' AND f.sp12273=0 AND month(b.date)='''+date_list[0]+''' AND year(b.date)='''+date_list[1]

	odbc=base()
	odbc.dsn='1sbdb05'
	gen=odbc.generate(sql)
	result=[]
	for row in gen:
		temp=[]
		for x in range(11):
			if row[x]=='None':
				temp+=[None]
			elif type(row[x])==str:
				temp+=[row[x].strip()]
			else:
				temp+=[row[x]]
		result+=[temp]
	#end of function suite
	return result